/**
 * 统一try catch处理中间件
 * 用于捕获内部错误，输出日志信息
 */
const Code = require('../common/error_code');
const logger = require('../utils/logger');
const token = require('../utils/token');
const sign = require('../utils/sign');
const pkg = require('../../package.json');

module.exports = async (ctx, next) => {
    // 响应开始时间
    const start = new Date();
    // 响应间隔时间
    let ms;
    try {
        // 显示版本号之类的基本信息
        if (ctx.request.path === '/') {
            ctx.response.type = 'application/json';
            ctx.response.body = { name: pkg.name, version: pkg.version, description: pkg.description, time: (new Date()).getTime() };
            return;
        }
        // 暂定针对视频预览APP的接口校验sign，其他接口都做token校验
        if (ctx.request.path.indexOf('/api/ipc/query_ipcs') === 0
            || ctx.request.path.indexOf('/api/guard/query_guard_time') === 0
            || ctx.request.path.indexOf('/api/stat/counting_detail') === 0
            || ctx.request.path.indexOf('/api/custom/query_logo') === 0
            || ctx.request.path.indexOf('/api/custom/query_custom_detail') === 0
            || ctx.request.path.indexOf('/api/custom/query_users_show') === 0
            ) {
            // 校验sign
            const signInfo = sign.getSign(ctx.request);
            if (signInfo) {
                if (!sign.verifySign(signInfo)) {
                    logger.logResponse(ctx, 0);
                    return ctx.error(Code.RET_ERR_SIGN);
                }
            } else {
                logger.logResponse(ctx, 0);
                return ctx.error(Code.RET_ERR_ILLEGAL);
            }
        } else {
            // 登录、下载抓拍图片不需要校验token,向外暴露特征值分析列表
            if (ctx.request.url.indexOf('/api/account/login') !== 0
                && ctx.request.url.indexOf('/api/record/download_capture') !== 0
                && ctx.request.url.indexOf('/api/download/start_download_file') !== 0
                && ctx.request.path.indexOf('/captureinfo') !== 0
                && ctx.request.path.indexOf('/keepalive') !== 0
                && ctx.request.path.indexOf('/register') !== 0
                && ctx.request.path.indexOf('/api/faceFeature/list') !== 0
                && ctx.request.path.indexOf('/api/user/batch_upload_student') !== 0
                && ctx.request.path.indexOf('/api/class_attendance/stat') !== 0
                && ctx.request.path.indexOf('/api/class_attendance/query_daily_attendance') !== 0
                && ctx.request.path.indexOf('/api/schedule/upload') !== 0) {
                const tokenInfo = token.getToken(ctx.request);
                // 校验token
                if (tokenInfo) {
                    if (!token.verifyToken(tokenInfo)) {
                        logger.logResponse(ctx, 0);
                        return ctx.error(Code.RET_ERR_AUTH);
                    }
                } else {
                    logger.logResponse(ctx, 0);
                    return ctx.error(Code.RET_ERR_ILLEGAL);
                }
            }
        }

        // // 校验sign
        // const signInfo = sign.getSign(ctx.request);
        // if (signInfo) {
        //     if (!sign.verifySign(signInfo)) {
        //         logger.logResponse(ctx, 0);
        //         return ctx.error(Code.RET_ERR_SIGN);
        //     }
        // } else {
        //     logger.logResponse(ctx, 0);
        //     return ctx.error(Code.RET_ERR_ILLEGAL);
        // }

        await next();

        ms = new Date() - start;
        // 记录响应日志
        logger.logResponse(ctx, ms);
    } catch (err) {
        // 记录异常日志
        ms = new Date() - start;
        logger.logException(ctx, err, ms);

        if (!err) {
            return ctx.error(Code.RET_ERR_UNKNOWN);
        }
        // if (typeof(err) == 'string') {
        //     return ctx.error(Code.RET_ERR_UNKNOWN);
        // }
        ctx.error(Code.RET_ERR_SERVER);
    }
}
